﻿using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace RAP.Framework.Libary.DataSource.Model
{
  /// <summary>
  /// 数据模型基类
  /// </summary>
  public abstract class DataModelBase : IDataModel
  {
    /// <summary>
    /// 数据解析上下文对象
    /// </summary>
    [NonSerialized]
    protected DataParseContext _context = null;

    /// <summary>
    /// 当前实体缓存懒加载数据的键值对
    /// </summary>
    [NonSerialized]
    protected Lazy<IDictionary<string, object>> _cachedLazyloadValues = new Lazy<IDictionary<string, object>>(() => new Dictionary<string, object>());

    /// <summary>
    /// 
    /// </summary>
    public void Dispose()
    {
      _cachedLazyloadValues.Value?.Clear();
      _cachedLazyloadValues = null;
      _context = null;
    }

    #region 内部调用方法
    /// <summary>
    /// 设置上下文对象（内部调用方法，请勿直接调用！）
    /// </summary>
    /// <param name="context"></param>
    public virtual void SetContext(DataParseContext context)
    {
      _context = context;
    }

    /// <summary>
    /// 获取上下文对象（内部调用方法，请勿直接调用！）
    /// </summary>
    /// <returns></returns>
    public virtual DataParseContext GetContext()
    {
      return _context;
    }

    /// <summary>
    /// 根据方法名称获取已缓存的懒加载数据（内部调用方法，请勿直接调用！）
    /// </summary>
    /// <param name="methodName"></param>
    /// <returns></returns>
    public virtual object GetCachedLazyloadValue(string methodName)
    {
      var loadedValues = _cachedLazyloadValues.Value;
      loadedValues.TryGetValue(methodName, out var value);
      return value;
    }

    /// <summary>
    /// 根据方法名称缓存懒加载的数据（内部调用方法，请勿直接调用！）
    /// </summary>
    /// <param name="methodName"></param>
    /// <param name="value"></param>
    public virtual void CacheLazyloadValue(string methodName, object value)
    {
      var loadedValues = _cachedLazyloadValues.Value;
      loadedValues.Add(methodName, value);
    }
    #endregion 内部调用方法
  }
}
